/**
 * 
 */
package br.com.ctm.advogadope.negocio.impl;

import java.util.List;

import javax.annotation.security.PermitAll;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.PersistenceException;

import br.com.ctm.advogadope.dao.api.UsuarioDao;
import br.com.ctm.advogadope.model.Usuario;
import br.com.ctm.advogadope.negocio.api.UsuarioNegocio;
import br.com.ctm.advogadope.util.StringUtils;
import br.com.framework.negocio.exception.NegocioException;
import br.com.framework.negocio.impl.BaseNegocioImpl;

/**
 * @author Cleber
 *
 */
@Stateless
@PermitAll
public class UsuarioNegocioImpl extends BaseNegocioImpl<Usuario, UsuarioDao> implements
		UsuarioNegocio {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 
	 */
	public UsuarioNegocioImpl() {
	}
	
	@Inject
	protected void setDao(UsuarioDao dao) {
		super.setDao(dao);
	}
	
	@Override
	public void insert(Usuario entidade) throws PersistenceException,
			NegocioException {
		validateEntity(entidade, true, false);
		entidade.setSenha(
				StringUtils.getEncryptedSenhaSha1(entidade.getSenha()));
		super.insert(entidade);
	}
	
	@Override
	public void update(Usuario entidade) throws PersistenceException,
			NegocioException {
		validateEntity(entidade, false, false);
		super.update(entidade);
	}

	/* (non-Javadoc)
	 * @see br.com.ctm.advogadope.negocio.api.UsuarioNegocio#update(br.com.ctm.advogadope.model.Usuario, boolean)
	 */
	@Override
	public void update(Usuario entidade, boolean ignorePasswordCheck)
			throws PersistenceException, NegocioException {
		validateEntity(entidade, false, true);
		super.update(entidade);
	}

	/**
	 * @param e
	 * @param isInsert
	 * @param ignorePasswordCheck
	 * @throws NegocioException
	 */
	protected void validateEntity(Usuario e, boolean isInsert, boolean ignorePasswordCheck) throws NegocioException {
		if (!ignorePasswordCheck) {
			if (!e.getSenha().equals(e.getConfirmaSenha())) {
				throw new NegocioException("usuario.erro.negocio.senhasNaoConferem");
			}
		}
		Usuario ex = new Usuario();
		ex.setEmail(e.getEmail());
		List<Usuario> list = findByExample(ex);
		if (!list.isEmpty()) {
			ex = list.get(0);
			if (!isInsert && !ex.getId().equals(e.getId())) {
				throw new NegocioException("usuario.erro.negocio.emailJaCadastrado");
			}
		}
	}
	
}
